<?php

App::uses('AppController', 'Controller');

class AgendasController extends AppController {
	
	public function ajuste(){
				
		if (!$this->request->data) {
		
			$this->set('title_for_layout', 'Agenda :: Ajuste');
			
			$this->set('medicos', $this->{$this->modelClass}->Medico->find('list', array('order' => array('nome'))));

		} else {
			
			
			
		}
	}
	
	public function ajuste_listar_horarios(){

		$this->layout = 'ajax';
		
		$medico_id 		= $this->request->data['Agenda']['medico_id'];
		$data_inicial 	= $this->{$this->modelClass}->date_to_us($this->request->data['Agenda']['data_inicial']);
		$data_final 	= $this->{$this->modelClass}->date_to_us($this->request->data['Agenda']['data_final']);

		$options['conditions']['data_agenda >='] = $data_inicial;
		$options['conditions']['data_agenda <='] = $data_final;
		$options['conditions']['medico_id'] = $medico_id;
		$options['order'] = 'Agenda.medico_id, Agenda.data_agenda, Agenda.horario, Agenda.id';
		$options['recursive'] = 0;
		$horarios = $this->{$this->modelClass}->find('all', $options);
		
		$this->set('horarios', $horarios);
		$this->set('data_inicial', $this->request->data['Agenda']['data_inicial']);		
		$this->set('data_final', $this->request->data['Agenda']['data_final']);
		$this->set('nome_medico', $this->{$this->modelClass}->Medico->get_nome($medico_id));
		$this->set('situacoes', $this->{$this->modelClass}->carregar_situacao());
		$this->set('salas', $this->{$this->modelClass}->Sala->get_list_sala_piso());
		
		/*
		$this->set('horarios', $this->{$this->modelClass}->find('all', $options));
		
		$this->set('data_inicial', $this->request->data['AgendaPesquisar']['data_inicial']);
		$this->set('data_final', $this->request->data['AgendaPesquisar']['data_final']);
		$this->set('nome_medico', $this->{$this->modelClass}->Medico->get_nome(@$this->request->data['AgendaPesquisar']['medico_id']));
		$this->set('salas', $this->{$this->modelClass}->Sala->get_list_sala_piso());
		$this->set('primeira_vez', $this->{$this->modelClass}->carregar_primeira_vez() );
		 */

	}	

	public function alterar($id = null){
		
		$this->autoRender = false;
		
		if ($this->request->data){

			$resultado = $this->validar_agendamento($this->request->data);
			
			if ($resultado['sucesso']) {
				
				$this->registra_historico($this->request->data); // precisa ser chamado antes de gravar os dados
				
				$this->{$this->modelClass}->persistir($this->request->data);
				
				$this->Session->write('ultimo_horario_alterado', $this->request->data['Agenda']['id']);
					
				if (isset($this->request->data['Agenda']['ocupar_horarios'])) {
					$this->ocupar_horarios($this->request->data['Agenda']['id'], $this->request->data['Agenda']['ocupar_horarios']);
				}
			}

			return json_encode($resultado);
			
		} else {
			
			$this->{$this->modelClass}->id = $id;
			$this->{$this->modelClass}->recursive = 0;
			$this->request->data = $this->{$this->modelClass}->read();
			
			$situacoes = $this->{$this->modelClass}->carregar_situacoes_possiveis($this->request->data['Agenda']['situacao']);

			$permite_excluir = (in_array($this->request->data['Agenda']['situacao'], array(1, 5, 8))) ? true : false;
			$permite_ocupar = (in_array($this->request->data['Agenda']['situacao'], array(1))) ? true : false;
			
			if ($this->request->data['Agenda']['situacao'] == 1) {
				$this->request->data['Agenda']['situacao'] = 2;
			} else {
				$this->request->data['Agenda']['observacoes_do_convenio'] = $this->{$this->modelClass}->Convenio->get_observacoes_agenda($this->request->data['Agenda']['convenio_id']);
				$this->request->data['Agenda']['data_ultima_consulta'] = $this->{$this->modelClass}->Paciente->get_data_ultimo_atendimento($this->request->data['Agenda']['paciente_id'], $this->request->data['Agenda']['medico_id']); 
			}
		}
		
		$this->set('situacoes', $situacoes);
		$this->set('tipos_procedimento', $this->{$this->modelClass}->TipoProcedimento->find('list'));
		$this->set('procedimentos', $this->{$this->modelClass}->Procedimento->find('list', array('conditions' => array('tipo_procedimento_id' => $this->request->data['Agenda']['tipo_procedimento_id']))));
		$this->set('salas', $this->{$this->modelClass}->Sala->get_list_sala_piso());
		$this->set('convenios_paciente', $this->{$this->modelClass}->Paciente->get_convenios_list($this->request->data['Agenda']['paciente_id'], 'array'));
		$this->set('convenios', $this->{$this->modelClass}->Convenio->find('list', array('order' => 'nome')));
		$this->set('tipos_confirmacao', $this->{$this->modelClass}->TipoConfirmacao->find('list', array('order' => array('nome'))));
		$this->set('telefones_paciente', $this->{$this->modelClass}->get_telefones_paciente($this->request->data['Agenda']['paciente_id']));
		$this->set('solic_adiantamento', $this->{$this->modelClass}->carregar_solicita_adiantamento());
		$this->set('permite_excluir', $permite_excluir);
		$this->set('permite_ocupar', $permite_ocupar);
		$this->set('primeira_vez', $this->{$this->modelClass}->carregar_primeira_vez());
		
		$this->layout = 'ajax';
		$this->render('alterar');		
	}
	
	public function alterar_horario() {
		$this->autoRender = false;
		
		$agenda_id = $_POST['agenda_id'];
		$horario = $_POST['horario'];
		
		$this->Agenda->id = $agenda_id;
		$this->Agenda->saveField('horario', $horario);
	}
	
	public function buscar_medicos_por_data($formato = 'array') {
		
		$this->autoRender = false;
		
		$data_inicial = $this->{$this->modelClass}->date_to_us($_POST['data_inicial']);
		$data_final = $this->{$this->modelClass}->date_to_us($_POST['data_final']);
		
		if (!$data_inicial || !$data_final) {
			return null;
		}		
		
		return $this->{$this->modelClass}->get_medicos_por_data($data_inicial, $data_final, array('formato' => $formato, 'empty' => true, 'texto_empty' => 'Todos'));
	}
	
	public function buscar_telefones_paciente($paciente_id = null) {
		
		$this->autoRender = false;
		
		return $this->{$this->modelClass}->get_telefones_paciente($paciente_id);
	}
	
	public function buscar_ultimo_atendimento() {
		
		$this->autoRender = false;
		
		$paciente_id 	= @$_POST['paciente_id'];
		$medico_id 		= @$_POST['medico_id'];
		//$data_agenda 	= @$_POST['data_agenda'];
		//$horario 		= @$_POST['horario'];
		
		return $this->{$this->modelClass}->Paciente->get_data_ultimo_atendimento($paciente_id, $medico_id);
		
	}
	
	public function cancelar_dia() {
		
		$this->autoRender = false;
		
		$data_inicial = $this->{$this->modelClass}->date_to_us($this->request->data['AgendaCancelar']['data_inicial']);
		$data_final = $this->{$this->modelClass}->date_to_us($this->request->data['AgendaCancelar']['data_final']);
		$medico_id = $this->request->data['AgendaCancelar']['medico_id'];
		$situacao = $this->request->data['AgendaCancelar']['situacao'];
		
		if ($situacao == 5) { // Cancelado
			
			$marcacoes = $this->{$this->modelClass}->find('all', array(
				'conditions' => array(
					'data_agenda >=' => $data_inicial, 
					'data_agenda <=' => $data_final,
					'medico_id' => $medico_id,
					'situacao' => array(1, 2, 3)
				)
			));
			
			foreach ($marcacoes as $marcacao) {
				
				$this->{$this->modelClass}->create();
				
				if ($marcacao['Agenda']['situacao'] == 1) {
					$this->{$this->modelClass}->delete($marcacao['Agenda']['id']);
				} else {
					$marcacao['Agenda']['situacao'] = 7;
					$this->{$this->modelClass}->persistir($marcacao);
				}
				
			}
			
		}

		if ($situacao == 7) { // Remarcar
			
			$this->{$this->modelClass}->updateAll(
				array('situacao' => $situacao),
				array('data_agenda >=' => $data_inicial, 'data_agenda <=' => $data_final, 'situacao' => array('2','3'), 'medico_id' => $medico_id)
			);
			
		}
	}
		
	public function carregar_horarios() {
		
		$this->layout = 'ajax';
		
		$options = array();
		
		$medico_id = @$this->request->data['AgendaPesquisar']['medico_id'];
		$convenio_id = @$this->request->data['AgendaPesquisar']['convenio_id'];
		
		$options['conditions']['data_agenda >='] = $this->{$this->modelClass}->date_to_us($this->request->data['AgendaPesquisar']['data_inicial']);
		$options['conditions']['data_agenda <='] = $this->{$this->modelClass}->date_to_us($this->request->data['AgendaPesquisar']['data_final']);
		$options['conditions']['medico_id'] = @$this->request->data['AgendaPesquisar']['medico_id'];
		
		if ($this->request->data['AgendaPesquisar']['apenas_livre'] == 1) {
			$options['conditions']['situacao'] = 1;	
		}
		
		$options['order'] = 'Agenda.medico_id, Agenda.data_agenda, Sala.piso_id, Agenda.horario';
		$options['recursive'] = 0;
		
		$options['fields'] = array(
			'Agenda.*',
			'Convenio.nome_curto',
			'Paciente.id',
			'Paciente.nome',
			'Procedimento.nome',
			'Sala.nome',
			'Sala.piso_id',
			'TipoProcedimento.nome',
			'TipoConfirmacao.classe_imagem_agenda'
		);
		
		/*
		$options['fields'] = array(
			'Agenda.*',
			'Convenio.*',
			'Paciente.*',
			'Procedimento.*',
			'Sala.*',
			'TipoProcedimento.*'
		);		
		*/

		$horarios = $this->{$this->modelClass}->find('all', $options);
		
		$this->set('horarios', $horarios);
		$this->set('situacoes', $this->{$this->modelClass}->carregar_situacao());
		$this->set('data_inicial', $this->request->data['AgendaPesquisar']['data_inicial']);
		$this->set('data_final', $this->request->data['AgendaPesquisar']['data_final']);
		$this->set('nome_medico', $this->{$this->modelClass}->Medico->get_nome_curto($medico_id));
		//$this->set('salas', $this->{$this->modelClass}->Sala->get_list_sala_piso());
		$this->set('primeira_vez', $this->{$this->modelClass}->carregar_primeira_vez() );
		$this->set('atende_primeira_vez', $this->{$this->modelClass}->Medico->MedicoConvenio->get_atende_primeira_vez($medico_id, $convenio_id) );
		$this->set('consultas_por_dia', $this->{$this->modelClass}->Medico->MedicoConvenio->MedicoconvenioProcedimento->get_atendimentos_por_dia($medico_id, $convenio_id, 3));
		$this->set('pisos', $this->{$this->modelClass}->Sala->Piso->find('list'));
	}
	
	public function carregar_medicos($formato = 'html') {
		
		$this->autoRender = false;
		
		$data_inicial 		= $this->{$this->modelClass}->date_to_us($this->request->data['AgendaPesquisar']['data_inicial']);
		$data_final 		= $this->{$this->modelClass}->date_to_us($this->request->data['AgendaPesquisar']['data_final']);
		$especialidade_id 	= $this->request->data['AgendaPesquisar']['especialidade_id'];
		$convenio_id 		= $this->request->data['AgendaPesquisar']['convenio_id'];
		
		$sql  = 'select distinct(Agendas.medico_id), medicos.nome from agendas, medico_convenios, medico_especialidades, medicos ';
		$sql .= 'where agendas.medico_id = medico_convenios.medico_id ';
		$sql .= 'and agendas.medico_id = medicos.id ';
		$sql .= "and medico_convenios.convenio_id = $convenio_id ";
		$sql .= "and medico_especialidades.especialidade_id = $especialidade_id ";
		$sql .= 'and medico_especialidades.medico_id = agendas.medico_id ';
		$sql .= "and agendas.data_agenda >= '$data_inicial' ";
		$sql .= "and agendas.data_agenda <= '$data_final' ";
		$sql .= 'order by medicos.nome ';
		
		$results = $this->{$this->modelClass}->query($sql);
		
		$retorno = null;
		$selected = "selected='selected'";
		
		foreach ($results as $key => $rs) {
			if ($formato == 'html') {
				$retorno .= "<option value='{$rs[0]['medico_id']}' $selected>{$rs[0]['nome']}</option>";
				$selected = null;
			} else {
				$retorno[$rs[0]['medico_id']] = $rs[0]['nome'];
			}
		}
		
		return $retorno;
		
	}
	
	public function confirmacao() {
		
		$this->set('title_for_layout', 'Agenda :: Confirmação');	
	}
	
	public function confirmacao_alterar($agenda_id, $tipo_confirmacao_id) {
		
		$this->autoRender = false;
		
		$this->{$this->modelClass}->id = $agenda_id;
		return $this->{$this->modelClass}->saveField('tipo_confirmacao_id', $tipo_confirmacao_id, array('callbacks' => false, 'validate' => false));
	}
	
	public function confirmacao_lista() {
		
		$this->layout = 'ajax';
		
		$options = array();
		
		$options['conditions']['data_agenda >='] = $this->{$this->modelClass}->date_to_us($this->request->data['Agenda']['data_inicial']);
		$options['conditions']['data_agenda <='] = $this->{$this->modelClass}->date_to_us($this->request->data['Agenda']['data_final']);
		$options['conditions']['medico_id'] = @$this->request->data['Agenda']['medico_id'];
		$options['conditions']['situacao'] = 2;	
		$options['order'] = 'Agenda.medico_id, Agenda.data_agenda, Agenda.horario, Agenda.id';
		$options['recursive'] = 0;
		
		$this->set('horarios', $this->{$this->modelClass}->find('all', $options));
		$this->set('data_inicial', $this->request->data['Agenda']['data_inicial']);
		$this->set('data_final', $this->request->data['Agenda']['data_final']);
		$this->set('nome_medico', $this->{$this->modelClass}->Medico->get_nome(@$this->request->data['Agenda']['medico_id']));
		$this->set('senha_telefone', $this->{$this->modelClass}->Medico->get_senha_telefone(@$this->request->data['Agenda']['medico_id']));
		$this->set('salas', $this->{$this->modelClass}->Sala->get_list_sala_piso());
		$this->set('tipos_confirmacao', $this->{$this->modelClass}->TipoConfirmacao->find('list', array('order' => array('nome'))));
	}
	
	public function criacao_manual(){
				
		if (!$this->request->data) {
		
			$this->set('title_for_layout', 'Agenda :: Criação Manual');
			
			$this->set('medicos', $this->{$this->modelClass}->Medico->find('list', array('order' => array('nome'))));
			$this->set('tipoprocedimentos', $this->Agenda->Medico->MedicoHorario->TipoProcedimento->find('list', array('order' => 'nome')));
			$this->set('salas', $this->{$this->modelClass}->Sala->get_list_sala_piso());
			$this->set('dia_semana',$this->{$this->modelClass}->Medico->MedicoHorario->carregar_dia_semana());

		} else {
			
			$this->autoRender = false;
			
			$medico_id 		= $this->request->data['Confirmar']['medico_id'];
			$data_inicial 	= $this->{$this->modelClass}->date_to_us($this->request->data['Confirmar']['data_inicial']);
			$data_final 	= $this->{$this->modelClass}->date_to_us($this->request->data['Confirmar']['data_final']);
			
			if (!$data_inicial) {
				return json_encode(array(
					'sucesso' => false,
					'mensagem' => 'Data Inicial deve ser informada!'
				));
			}

			if (!$data_final) {
				return json_encode(array(
					'sucesso' => false,
					'mensagem' => 'Data Final deve ser informada!'
				));
			}
			
			if ($data_inicial > $data_final) {
				return json_encode(array(
					'sucesso' => false,
					'mensagem' => 'Datas invertidas!'
				));
			}

			if ($this->{$this->modelClass}->date_difference($data_inicial, $data_final) > 30) {
				return json_encode(array(
					'sucesso' => false,
					'mensagem' => 'Intervalo entre as datas não pode ser superior a 30 dias!'
				));				
			}			

			if (!$medico_id) {
				return json_encode(array(
					'sucesso' => false,
					'mensagem' => 'Médico deve ser selecionado!'
				));
			}
			
			$tot_horarios = 0;
			
			$this->{$this->modelClass}->Behaviors->disable('DateFormatter');
			
			while ($data_inicial <= $data_final) {

				$dia_semana = $this->{$this->modelClass}->date_week($data_inicial);
				
				if ($dia_semana == 0) {
					$data_inicial = $this->{$this->modelClass}->date_add_days($data_inicial, 1);
					continue;
				}
				
				foreach($this->request->data['Confirmar']['horarios'] as $dados) {
					
					if ($dados['dia_semana'] == $dia_semana) {
						
						$agenda = array();
						
						$agenda['Agenda']['medico_id'] 				= $medico_id;
						$agenda['Agenda']['data_agenda'] 			= $data_inicial;
						$agenda['Agenda']['dia_semana'] 			= $this->{$this->modelClass}->dia_semana($data_inicial);
						$agenda['Agenda']['horario'] 				= $dados['hora_inicio'];
						$agenda['Agenda']['tipo_procedimento_id'] 	= $dados['tipo_procedimento_id'];
						$agenda['Agenda']['sala_id'] 				= $dados['sala_id'];
						$agenda['Agenda']['tipo_horario'] 			= 'N';
						$agenda['Agenda']['situacao'] 				= 1;
						$agenda['Agenda']['observacoes'] 			= null;
						$agenda['Agenda']['observacao_medico_horario'] = $dados['observacao'];
						$agenda['Agenda']['solicita_adiantamento'] 	= 'N';
						
						$this->{$this->modelClass}->create();
						
						if ($this->{$this->modelClass}->save($agenda, array('validate' => false))) {
							$tot_horarios++;
						}
						
					}
					
				}
				
				$data_inicial = $this->{$this->modelClass}->date_add_days($data_inicial, 1);
			}
			
			if ($tot_horarios > 0) {
				
				return json_encode(array(
					'sucesso' => true,
					'mensagem' => "Total de horários criados: $tot_horarios"
				));				
				
			} else {
				
				return json_encode(array(
					'sucesso' => false,
					'mensagem' => 'Erro: nenhum horário foi criado.'
				));				
			}
		}
	}
	
	public function criacao_manual_armazenar() {
		
		$this->autoRender = false;
		
		if (!$this->request->data['Agenda']['dia_semana']) {
			return json_encode(array(
				'sucesso' => false,
				'mensagem' => 'Dia da semana deve ser selecionado!'
			));
		}
		
		if (!$this->request->data['Agenda']['hora_inicio']) {
			return json_encode(array(
				'sucesso' => false,
				'mensagem' => 'Horário deve ser informado!'
			));
		}
		
		if (!$this->request->data['Agenda']['tipo_procedimento_id']) {
			return json_encode(array(
				'sucesso' => false,
				'mensagem' => 'Tipo do Procedimento deve ser selecionado!'
			));
		}		
		
		if (!$this->request->data['Agenda']['sala_id']) {
			return json_encode(array(
				'sucesso' => false,
				'mensagem' => 'Sala deve ser selecionada!'
			));
		}

		$criacao_manual = $this->Session->read('criacao_manual');
		
		$criacao_manual[] = array(
			'dia_semana' 			=> $this->request->data['Agenda']['dia_semana'],
			'hora_inicio' 			=> $this->request->data['Agenda']['hora_inicio'],
			'tipo_procedimento_id' 	=> $this->request->data['Agenda']['tipo_procedimento_id'],
			'sala_id' 				=> $this->request->data['Agenda']['sala_id'],
			'observacao' 			=> $this->request->data['Agenda']['observacao']
		);
		
		$this->Session->write('criacao_manual', $criacao_manual);
		
		return json_encode(array(
			'sucesso' => true,
			'mensagem' => ''
		));
	}
	
	public function criacao_manual_carregar() {
		
		$this->layout = 'ajax';
		
		$criacao_manual = $this->Session->read('criacao_manual');
				
		$this->set('tipoprocedimentos', $this->Agenda->Medico->MedicoHorario->TipoProcedimento->find('list', array('order' => 'nome')));
		$this->set('salas', $this->{$this->modelClass}->Sala->get_list_sala_piso());
		$this->set('dia_semana',$this->{$this->modelClass}->Medico->MedicoHorario->carregar_dia_semana());	
		$this->set('criacao_manual', $criacao_manual);
		$this->render('criacao_manual_horarios');
	}
	
	public function criacao_manual_excluir_horario($key) {

		$this->autoRender = false;
		
		$criacao_manual = $this->Session->read('criacao_manual');

		unset($criacao_manual[$key]);
		
		$this->Session->write('criacao_manual', $criacao_manual);
	}
		
	public function criar(){
		
		$this->set('title_for_layout', 'Agenda :: Criar');
		
		$this->set('medicos', $this->{$this->modelClass}->Medico->find('list', array('order' => array('nome'))));
		
		if ($this->request->data) {
			
			$data_inicial = $this->{$this->modelClass}->date_to_us($this->request->data[$this->modelClass]['data_inicial']);
			$data_final = $this->{$this->modelClass}->date_to_us($this->request->data[$this->modelClass]['data_final']);
			$medico_id = $this->request->data[$this->modelClass]['medico_id'];
			
			if (!$data_inicial) {
				return $this->Session->setFlash('Data Inicial deve ser informada!', 'default', array('class' => 'flashError'));
			}
			
			if (!$data_final) {
				return $this->Session->setFlash('Data Final deve ser informada!', 'default', array('class' => 'flashError'));
			}

			if ($data_inicial > $data_final) {
				return $this->Session->setFlash('Datas invertidas!', 'default', array('class' => 'flashError'));
			}

			if (!$medico_id) {
				return $this->Session->setFlash('Médico deve ser informado!', 'default', array('class' => 'flashError'));
			}
			
			if ($this->{$this->modelClass}->date_difference($data_inicial, $data_final) > 30) {
				return $this->Session->setFlash('Intervalo entre as datas não pode ser superior a 30 dias!', 'default', array('class' => 'flashError'));
			}
			
			$horarios = $this->Agenda->Medico->MedicoHorario->find('all', 
				array(
					'conditions' => array('medico_id' => $medico_id)
				)
			);
			
			$tot_horarios = 0;
			
			$this->{$this->modelClass}->Behaviors->disable('DateFormatter');
			
			while ($data_inicial <= $data_final) {

				$dia_semana = $this->{$this->modelClass}->date_week($data_inicial);
				
				if ($dia_semana == 0) {
					$data_inicial = $this->{$this->modelClass}->date_add_days($data_inicial, 1);
					continue;
				}
				
				foreach($horarios as $horario) {
					
					if ($horario['MedicoHorario']['dia_semana'] == $dia_semana) {
						
						$agenda = array();
						
						$agenda['Agenda']['medico_id'] 				= $medico_id;
						$agenda['Agenda']['data_agenda'] 			= $data_inicial;
						$agenda['Agenda']['dia_semana'] 			= $this->{$this->modelClass}->dia_semana($data_inicial);
						$agenda['Agenda']['horario'] 				= $horario['MedicoHorario']['hora_inicio'];
						$agenda['Agenda']['tipo_procedimento_id'] 	= $horario['MedicoHorario']['tipo_procedimento_id'];
						$agenda['Agenda']['sala_id'] 				= $horario['MedicoHorario']['sala_id'];
						$agenda['Agenda']['tipo_horario'] 			= 'N';
						$agenda['Agenda']['situacao'] 				= 1;
						$agenda['Agenda']['observacoes'] 			= null;
						$agenda['Agenda']['observacao_medico_horario'] = $horario['MedicoHorario']['observacao'];
						$agenda['Agenda']['solicita_adiantamento'] 	= 'N';
						
						$this->{$this->modelClass}->create();
						
						if ($this->{$this->modelClass}->save($agenda, array('validate' => false))) {
							$tot_horarios++;
						}
						
					}
					
				}
				
				$data_inicial = $this->{$this->modelClass}->date_add_days($data_inicial, 1);
			}
			
			if ($tot_horarios > 0) {
				$this->Session->setFlash("Total de horários criados: $tot_horarios", 'default', array('class' => 'flashOk'));
			} else {
				$this->Session->setFlash('Erro: nenhum horário foi criado.', 'default', array('class' => 'flashError'));
			}
			
		}

	}
	
	public function encaixe($id) {
		
		$this->autoRender = false;
		
		$this->{$this->modelClass}->id = $id;
		$agenda = $this->{$this->modelClass}->read();
		
		$permite_encaixe = $this->{$this->modelClass}->Medico->field('permite_encaixe', array('id' => $agenda['Agenda']['medico_id']));
		
		$sucesso = true;
		$mensagem = null;
		$tipo = null;
		
		if ($permite_encaixe == 'N') {

			$sucesso = false;
			$mensagem = 'O médico não permite encaixes.';
			$tipo = 'error'; // ou warning
			
		} else {

			$numero_encaixe = $this->{$this->modelClass}->Medico->get_numero_encaixe($agenda['Agenda']['medico_id']);
			
			if ($numero_encaixe > 0) {

				$total = $this->{$this->modelClass}->find('count', 
					array(
						'conditions' => 
							array(
								'medico_id' => $agenda['Agenda']['medico_id'], 
								'data_agenda' => $this->{$this->modelClass}->date_to_us($agenda['Agenda']['data_agenda']),
								'tipo_horario' => 'E'
						)
					)
				);
				
				if ($total >= $numero_encaixe) {
					$sucesso = false;
					$mensagem = 'O médico aceita apenas ' . $numero_encaixe . ' encaixe(s) e já existe(m) ' . $total . ' encaixe(s) na agenda atual.';
					$tipo = 'error'; // ou warning
				}

			}

		}
		
		$horario = $this->{$this->modelClass}->hour_add_minutes($agenda['Agenda']['horario'], 1);
		
		return json_encode(
			array(
				'sucesso' => $sucesso,
				'horario' => substr($horario,0,5),
				'mensagem' => $mensagem,
				'tipo' => $tipo
			)
		);
		
	}
		
	public function excluir(){
		
		$this->autoRender = false;
		
		$agenda_id = $this->request->data['AgendaExcluir']['id'];
		
		$senha = AuthComponent::password($this->request->data['AgendaExcluir']['senha']);
		
		$this->loadModel('Parametro');
		
		if ($this->Parametro->get_senha_excluir_horario() != $senha) {
				
			$sucesso = false;
			$mensagem = 'Senha inválida!';
							
		} else {
			
			$this->{$this->modelClass}->delete($agenda_id);
			
			$sucesso = true;
			$mensagem = '';
			
		}
		
		return json_encode(
			array(
				'sucesso' => $sucesso,
				'mensagem' => $mensagem
			)
		);
	}
	
	public function excluir_agenda(){
		
		$this->set('title_for_layout', 'Agenda :: Excluir');
		
		$this->set('medicos', $this->{$this->modelClass}->Medico->find('list', array('order' => array('nome'))));
		
		$resultado = false;
		
		if ($this->request->data) {
			
			$data_inicial = $this->{$this->modelClass}->date_to_us($this->request->data[$this->modelClass]['data_inicial']);
			$data_final = $this->{$this->modelClass}->date_to_us($this->request->data[$this->modelClass]['data_final']);
			$medico_id = $this->request->data[$this->modelClass]['medico_id'];
			$segunda = $this->request->data[$this->modelClass]['segunda'];
			$terca = $this->request->data[$this->modelClass]['terca'];
			$quarta = $this->request->data[$this->modelClass]['quarta'];
			$quinta = $this->request->data[$this->modelClass]['quinta'];
			$sexta = $this->request->data[$this->modelClass]['sexta'];
			$sabado = $this->request->data[$this->modelClass]['sabado'];
			
			if (!$data_inicial) {
				return $this->Session->setFlash('Data Inicial deve ser informada!', 'default', array('class' => 'flashError'));
			}
			
			if (!$data_final) {
				return $this->Session->setFlash('Data Final deve ser informada!', 'default', array('class' => 'flashError'));
			}

			if ($data_inicial > $data_final) {
				return $this->Session->setFlash('Datas invertidas!', 'default', array('class' => 'flashError'));
			}

			if (!$medico_id) {
				return $this->Session->setFlash('Médico deve ser informado!', 'default', array('class' => 'flashError'));
			}
			
			if ($this->{$this->modelClass}->date_difference($data_inicial, $data_final) > 30) {
				return $this->Session->setFlash('Intervalo entre as datas não pode ser superior a 30 dias!', 'default', array('class' => 'flashError'));
			}
			
			$total_exclusoes = 0;
			$total_erros = 0;
			
			while ($data_inicial <= $data_final) {

				$dia_semana = $this->{$this->modelClass}->date_week($data_inicial);
				
				$excluir = false;
				
				if ($dia_semana == 1 && $segunda == 1) $excluir = true;
				if ($dia_semana == 2 && $terca == 1) $excluir = true;
				if ($dia_semana == 3 && $quarta == 1) $excluir = true;
				if ($dia_semana == 4 && $quinta == 1) $excluir = true;
				if ($dia_semana == 5 && $sexta == 1) $excluir = true;
				if ($dia_semana == 6 && $sabado == 1) $excluir = true;
				
				if ($excluir) {
					
					$conditions = array();
				
					$conditions['Agenda.data_agenda'] = $data_inicial;
					$conditions['Agenda.medico_id'] = $medico_id;
					$conditions['Agenda.situacao'] = array(2,3,4);
	
					$total_marcacoes = $this->{$this->modelClass}->find('count', array('conditions' => $conditions));
					
					if ($total_marcacoes > 0) {
						$resultado .= $this->{$this->modelClass}->date_to_br($data_inicial) . ' - Marcações: ' . $total_marcacoes . '<br />';
						$total_erros++;
					} else {
						unset($conditions['Agenda.situacao']);
						$total_marcacoes = $this->{$this->modelClass}->find('count', array('conditions' => $conditions));
						if ($this->{$this->modelClass}->deleteAll($conditions)) {
							if ($total_marcacoes > 0) {
								$total_exclusoes++;
							} 
						} else {
							$resultado .= $this->{$this->modelClass}->date_to_br($data_inicial) . ' - Erro desconhecido!<br />';
							$total_erros++;
						}
					}

				}

				$data_inicial = $this->{$this->modelClass}->date_add_days($data_inicial, 1);
			}
			
			if ($total_erros > 0) {
				$resultado = 'Dias excluídos: ' . $total_exclusoes . '<br /><br />Erros:<br /><br />' . $resultado;
			} else {
				$resultado = 'Dias excluídos: ' . $total_exclusoes;
			}

		}
		
		$this->set('resultado', $resultado);

	}
	
	public function extra() {
		
		$this->autoRender = false;
		
		$agenda_id = $this->request->data['AgendaExtra']['id'];
		$senha = AuthComponent::password($this->request->data['AgendaExtra']['senha']);
		
		$this->{$this->modelClass}->id = $agenda_id;
		$agenda = $this->{$this->modelClass}->read();
		
		$permite_extras = $this->{$this->modelClass}->Medico->field('permite_extras', array('id' => $agenda['Agenda']['medico_id']));
		
		$sucesso = true;
		$mensagem = null;
		$tipo = null;
		
		if ($permite_extras == 'N') {

			$sucesso = false;
			$mensagem = 'O médico não permite extras.';
			$tipo = 'error'; // ou warning
			
		} else {

			$this->loadModel('Parametro');
			
			if ($this->Parametro->get_senha_agendar_horario_extra() != $senha) {
				
				$sucesso = false;
				$mensagem = 'A senha não confere.';
				$tipo = 'error'; // ou warning
							
			} else {
			
				$numero_extras = $this->{$this->modelClass}->Medico->get_numero_extras($agenda['Agenda']['medico_id']);
				
				if ($numero_extras > 0) {
	
					$total = $this->{$this->modelClass}->find('count', 
						array(
							'conditions' => 
								array(
									'medico_id' => $agenda['Agenda']['medico_id'], 
									'data_agenda' => $this->{$this->modelClass}->date_to_us($agenda['Agenda']['data_agenda']),
									'tipo_horario' => 'T'
							)
						)
					);
					
					if ($total >= $numero_extras) {
						$sucesso = false;
						$mensagem = 'O médico aceita apenas ' . $numero_extras . ' extra(s) e já existe(m) ' . $total . ' extra(s) na agenda atual.';
						$tipo = 'error'; // ou warning
					}
	
				}
			
			}

		}
		
		$horario = $this->{$this->modelClass}->hour_add_minutes($agenda['Agenda']['horario'], 1);
		
		return json_encode(
			array(
				'sucesso' => $sucesso,
				'horario' => substr($horario,0,5),
				'mensagem' => $mensagem,
				'tipo' => $tipo
			)
		);
		
	}	
	
	public function finalizar_dia() {
		
		$this->autoRender = false;
		
		$data_agenda = $this->request->data['AgendaFinalizar']['data_agenda'];
		
		$tot_alteracoes = $this->verificacao_agenda($data_agenda);
		
		return json_encode(array('tot_alteracoes' => $tot_alteracoes));
		
	}
	
	public function imprimir(){
		
		if ($this->request->data) {
			
			$this->layout = 'relatorios';
			
			$data_inicial = $this->{$this->modelClass}->date_to_us($this->request->data['Agenda']['data_inicial']);
			$data_final = $this->{$this->modelClass}->date_to_us($this->request->data['Agenda']['data_final']);
			$medico_id = $this->request->data['Agenda']['medico_id'];
			$situacao = $this->request->data['Agenda']['situacao'];
			$solicita_adiantamento = $this->request->data['Agenda']['solicita_adiantamento'];
			$exibir_telefones = ($this->request->data['Agenda']['exibir_telefones'] == 1) ? true : false;
			
			$options['recursive'] = 0;
			$options['order'] = 'Agenda.medico_id, Agenda.data_agenda, Agenda.horario, Agenda.id';
			$options['conditions']['data_agenda >='] = $data_inicial;
			$options['conditions']['data_agenda <='] = $data_final;
			
			//$nome_medico = 'Todos';
			
			$titulo = null;
			
			if ($medico_id) {
				$options['conditions']['medico_id'] = $medico_id;
				//$nome_medico = $this->{$this->modelClass}->Medico->get_nome($medico_id);
			}
			
			$descricao_situacao = 'Todas';
			
			if ($situacao) {
				$options['conditions']['situacao'] = $situacao;
				$descricao_situacao = strtoupper($this->{$this->modelClass}->descricao_situacao($situacao));
			}
			
			$descricao_situacao = strtoupper($descricao_situacao);
			
			$descricao_adiantamento = 'Não';
			
			if ($solicita_adiantamento) {
				$options['conditions']['solicita_adiantamento'] = $solicita_adiantamento;
				$descricao_adiantamento = $this->{$this->modelClass}->descricao_solicita_adiantamento($solicita_adiantamento);
			}
			
			$marcacoes = $this->{$this->modelClass}->find('all', $options);
			
			$this->set('results', $marcacoes);
			$this->set('data_inicial', $this->request->data['Agenda']['data_inicial']);
			$this->set('data_final', $this->request->data['Agenda']['data_final']);
			//$this->set('medico_nome', $nome_medico);
			$this->set('tipo_confirmacoes', $this->{$this->modelClass}->TipoConfirmacao->find('list'));
			$this->set('convenios', $this->{$this->modelClass}->Convenio->find('list'));
			$this->set('descricao_situacao', $descricao_situacao);
			$this->set('descricao_adiantamento', $descricao_adiantamento);
			$this->set('situacoes', $this->{$this->modelClass}->carregar_situacao());
			$this->set('exibir_telefones', $exibir_telefones);
			$this->set('primeira_vez', $this->{$this->modelClass}->carregar_primeira_vez());
			$this->render('rel_agenda');
			
		} else {

			$this->set('title_for_layout', 'Agenda :: Imprimir');
			//$this->set('data_agenda', $this->{$this->modelClass}->today('br'));
			$this->set('medicos', $this->{$this->modelClass}->get_medicos_por_data($this->{$this->modelClass}->today('us'), $this->{$this->modelClass}->today('us'), array('formato' => 'array')));
			$this->set('situacoes', $this->{$this->modelClass}->carregar_situacao());
			$this->set('solic_adiantamento', $this->{$this->modelClass}->carregar_solicita_adiantamento());
		}
	}
	
	public function imprimir_ficha($agenda_id){
		
		$this->layout='ajax';
		$this->Agenda->id=$agenda_id;
		$this->Agenda->recursive=2;
		$this->set('agenda',$this->Agenda->read(
			array(
				'Medico.nome',
		        'Convenio.nome',
				'Paciente.nome',
				'Paciente.data_nascimento',
				'Paciente.endereco_logradouro',
				'Paciente.endereco_numero',
				'Paciente.endereco_complemento',
				'Paciente.endereco_bairro',
				'Paciente.endereco_cep',
				'Paciente.telefone1',
				'Paciente.celular1',
				'Paciente.celular2',
				'Paciente.celular3',
				'Agenda.data_agenda',
				'Agenda.paciente_id',
				'Paciente.cidade_id',
				'Paciente.profissao_id',
				'Paciente.estado_civil_id',
			)
		));
	}
	
	public function incluir_paciente() {
		
		$this->autoRender = false;
		
		$paciente['Paciente']['nome'] 					= $this->request->data['IncluirPaciente']['nome'];
		$paciente['Paciente']['telefone1']			 	= $this->request->data['IncluirPaciente']['telefone1'];
		$paciente['Paciente']['telefone1_nome'] 		= $this->request->data['IncluirPaciente']['telefone1_nome'];
		$paciente['Paciente']['telefone2'] 				= $this->request->data['IncluirPaciente']['telefone2'];
		$paciente['Paciente']['telefone2_nome'] 		= $this->request->data['IncluirPaciente']['telefone2_nome'];
		$paciente['Paciente']['celular1'] 				= $this->request->data['IncluirPaciente']['celular1'];
		$paciente['Paciente']['celular1_nome'] 			= $this->request->data['IncluirPaciente']['celular1_nome'];
		$paciente['Paciente']['celular2'] 				= $this->request->data['IncluirPaciente']['celular2'];
		$paciente['Paciente']['celular2_nome'] 			= $this->request->data['IncluirPaciente']['celular2_nome'];
		$paciente['Paciente']['celular3'] 				= $this->request->data['IncluirPaciente']['celular3'];
		$paciente['Paciente']['celular3_nome'] 			= $this->request->data['IncluirPaciente']['celular3_nome'];	
		$paciente['Paciente']['data_nascimento'] 		= $this->{$this->modelClass}->date_to_us($this->request->data['IncluirPaciente']['data_nascimento']);
		$paciente['PacienteConvenio'][0]['convenio_id'] = $this->request->data['IncluirPaciente']['convenio_id'];
		$paciente['PacienteConvenio'][0]['ativo'] 		= 'S';
		
		if (!$paciente['Paciente']['nome']) {
			return json_encode(array('sucesso' => false, 'mensagem' => 'Nome do paciente deve ser informado!'));
		}
		
		if (!$paciente['Paciente']['data_nascimento']) {
			return json_encode(array('sucesso' => false, 'mensagem' => 'Data de Nascimento do paciente deve ser informada!'));
		}
		
		if (!$this->Agenda->checkdate($paciente['Paciente']['data_nascimento'])) {
			return json_encode(array('sucesso' => false, 'mensagem' => 'Data de Nascimento inválida!'));
		}		
		
		if (!$paciente['Paciente']['telefone1'] && !$paciente['Paciente']['celular1'] && !$paciente['Paciente']['celular3']) {
			return json_encode(array('sucesso' => false, 'mensagem' => 'Deve-se informar o Telefone fixo 1 ou Telefone celular 1 ou Telefone de nove dígitos!'));
		}		
		
		if ($this->{$this->modelClass}->Paciente->is_cadastrado($paciente['Paciente']['nome'], $paciente['Paciente']['data_nascimento'])) {
			return json_encode(array('sucesso' => false, 'mensagem' => 'Já existe um paciente cadastrado com este nome e data de nascimento!'));
		}
		
		if (!$paciente['PacienteConvenio'][0]['convenio_id']) {
			return json_encode(array('sucesso' => false, 'mensagem' => 'Convênio deve ser informado!'));
		}
		
		if ($this->Agenda->Paciente->saveAll($paciente, array('callbacks' => false, 'validate' => false))) {
			return json_encode(
				array(
					'sucesso' => true, 
					'mensagem' => '',
					'paciente_id' => $this->Agenda->Paciente->id
				)
			);
		} else {
			return json_encode(array('sucesso' => false, 'mensagem' => 'Houve um erro ao tentar incluir o paciente!'));
		}

	}
		
	public function index() {
		
		$this->verificar_agenda();
		
		$this->set('title_for_layout', 'Agenda :: Marcação');
		
		$this->loadModel('Especialidade');
		$this->set('especialidades', $this->Especialidade->find('list', array('order' => array('nome'))));
		
		$this->loadModel('Convenio');
		$this->set('convenios', $this->Convenio->find('list', array('order' => array('nome'))));
		
		$this->set('data_final', $this->{$this->modelClass}->date_add_days(date('d/m/Y'), 30));
		
		$this->set('situacoes_cancelamento', $this->{$this->modelClass}->carregar_situacao_cancelamento());
	}

	public function lista_espera() {
		
		$this->verificar_agenda();
		
		$this->set('title_for_layout', 'Agenda :: Lista de Espera');
	}

	public function ocupar_horarios($agenda_id, $qtde_horarios) {
		
		if ($qtde_horarios <= 1) {
			return false;
		}
		
		$this->{$this->modelClass}->id = $agenda_id;
		$agenda = $this->{$this->modelClass}->read(); 
		
		$horarios = $this->{$this->modelClass}->find('all', 
			array(
				'conditions' => 
					array(
						'data_agenda' => $this->{$this->modelClass}->date_to_us($agenda['Agenda']['data_agenda']),
						'medico_id' => $agenda['Agenda']['medico_id'],
						'horario >' => $agenda['Agenda']['horario']
					),
				'order' => 'Agenda.medico_id, Agenda.data_agenda, Agenda.horario, Agenda.id'
			)
		);
		
		$ocupou = 1; // começa em 1 pq ocupa o próprio horário
		foreach ($horarios as $horario) {
			if ($horario['Agenda']['situacao'] != 1) {
				break;
			}
			if ($ocupou == $qtde_horarios) {
				break;
			}
			$obj['Agenda']['id'] = $horario['Agenda']['id'];
			$obj['Agenda']['observacoes'] = $horario['Agenda']['observacoes'] . ' ***Horário bloqueado para marcação anterior***';
			$obj['Agenda']['situacao'] = 11; 
			$this->{$this->modelClass}->create();
			$this->{$this->modelClass}->save($obj, array('callbacks' => false, 'validate' => false));
			$ocupou++;
		}
		
		return ($ocupou == $qtde_horarios) ? true : false;
	}
	
	public function pesquisar_paciente() {
		
		$this->layout = 'ajax';
		
		$data_inicial = $this->{$this->modelClass}->date_to_us($this->request->data['AgendaPesquisarPaciente']['data_inicial']);
		$paciente_nome = '%' . $this->request->data['AgendaPesquisarPaciente']['paciente_nome'] . '%';
		
		$result = $this->Agenda->find('all', 
			array(
				'recursive' => 0, 
				'conditions' => array(
					'Agenda.data_agenda >=' => $data_inicial, 'Paciente.nome ILIKE' => $paciente_nome
				),
				'order' => 'Agenda.data_agenda, Agenda.horario'
			)
		);
		
		$this->set('result', $result);
		$this->set('situacoes', $this->{$this->modelClass}->carregar_situacao());
		
		$this->render('pesquisar_paciente_lista');
		
	}
	
	public function procurar_restricao() {
		
		$this->autoRender = false;
		
		$medico_id	 = $_POST['medico_id'];
		$paciente_id = $_POST['paciente_id'];
		
		$restricao = $this->{$this->modelClass}->Medico->get_restricao($medico_id, $paciente_id);

		$retorno['restricao'] = ($restricao) ? true : false; 
		$retorno['recomendacoes'] = $restricao['ListanegraMedicopaciente']['recomendacoes'];
		
		return json_encode($retorno);
	}
	
	public function procurar_vaga() {
		
		if ($this->request->data) {
			
			$this->autoRender = false;
			$this->layout = 'ajax';
			
			$data_inicial 		= $this->{$this->modelClass}->date_to_us($this->request->data['Agenda']['data_inicial']);
			$data_final 		= $this->{$this->modelClass}->date_to_us($this->request->data['Agenda']['data_final']);
			$convenio_id 		= $this->request->data['Agenda']['convenio_id'];
			$procedimento_id 	= $this->request->data['Agenda']['procedimento_id'];
			$paciente_id 		= $this->request->data['Agenda']['paciente_id'];
			$especialidade_id	= $this->request->data['Agenda']['especialidade_id'];
			$primeira_vez		= $this->request->data['Agenda']['primeira_vez'];
			
			if (!$data_inicial || !$data_final || !$convenio_id || !$procedimento_id || !$paciente_id || !$especialidade_id) {
				return null;
			}
			
			$campos  = 'agendas.id as agenda_id, ';
			$campos .= 'agendas.data_agenda, ';
			$campos .= 'agendas.medico_id, ';
			$campos .= 'agendas.dia_semana, ';
			$campos .= 'agendas.horario, ';
			$campos .= 'agendas.observacao_medico_horario, ';
			$campos .= 'medicos.nome as medico_nome ';
			
			$sql  = "select $campos from agendas, medicos, medico_convenios, medicoconvenio_procedimentos, medico_especialidades ";
			$sql .= 'where agendas.medico_id = medicos.id ';
			$sql .= 'and agendas.medico_id = medico_convenios.medico_id ';
			$sql .= "and medico_convenios.convenio_id = $convenio_id ";
			$sql .= "and agendas.data_agenda >= '$data_inicial' ";
			$sql .= "and agendas.data_agenda <= '$data_final' ";
			$sql .= 'and medicoconvenio_procedimentos.medico_convenio_id = medico_convenios.id ';
			$sql .= "and medicoconvenio_procedimentos.procedimento_id = $procedimento_id ";			
			$sql .= "and medico_especialidades.especialidade_id = $especialidade_id ";
			$sql .= 'and medico_especialidades.medico_id = agendas.medico_id ';
			$sql .= 'and agendas.situacao = 1 ';
			$sql .= 'order by agendas.data_agenda, agendas.horario ';
			
			$results = $this->{$this->modelClass}->query($sql);
			
			$retorno = array();
			$cont = 0;
			
			foreach ($results as $key => $rs) {

				$request['Agenda']['id'] 				= $rs[0]['agenda_id'];
				$request['Agenda']['situacao'] 			= 2;
				$request['Agenda']['convenio_id']		= $convenio_id;
				$request['Agenda']['procedimento_id']	= $procedimento_id;
				$request['Agenda']['data_agenda']		= $rs[0]['data_agenda'];
				$request['Agenda']['medico_id']			= $rs[0]['medico_id'];
				$request['Agenda']['paciente_id']		= $paciente_id;
				$request['Agenda']['tipo_horario']		= 'N';
				$request['Agenda']['primeira_vez']		= $primeira_vez;
				
				$resultado = $this->validar_agendamento($request);
				
				if ($resultado['sucesso']) {
					$retorno[$cont]['Agenda']['id'] = $rs[0]['agenda_id'];
					$retorno[$cont]['Agenda']['data_agenda'] = $this->{$this->modelClass}->date_to_br($rs[0]['data_agenda']);
					$retorno[$cont]['Agenda']['dia_semana'] = $rs[0]['dia_semana'];
					$retorno[$cont]['Agenda']['horario'] = $rs[0]['horario'];
					$retorno[$cont]['Agenda']['observacao_medico_horario'] = $rs[0]['observacao_medico_horario'];
					$retorno[$cont]['Medico']['nome'] = $rs[0]['medico_nome'];
					$cont++;	
				}

			}
			
			$this->set('result', $retorno);
			$this->render('procurar_vaga_lista');
			
		} else {
			
			$this->set('title_for_layout', 'Agenda :: Procurar Vaga');
			$this->set('tipos_procedimento', $this->{$this->modelClass}->TipoProcedimento->find('list'));
			$this->set('especialidades', $this->{$this->modelClass}->Medico->MedicoEspecialidade->Especialidade->find('list', array('order' => 'nome')));
			$this->set('data_final', $this->{$this->modelClass}->date_add_days(date('d/m/Y'), 30));
			$this->set('primeira_vez', $this->{$this->modelClass}->carregar_primeira_vez());
		}

	}
	
	public function registra_historico($request) {
		
		$this->{$this->modelClass}->id = $request['Agenda']['id'];
		$agenda = $this->{$this->modelClass}->read();
		
		$situacao_antes = $agenda['Agenda']['situacao'];
		$situacao_depois = $request['Agenda']['situacao'];
		
		if ($situacao_antes != $situacao_depois && $situacao_depois > 2) {

			$historico['HistoricoAgendamento']['medico_id']		= $request['Agenda']['medico_id'];
			$historico['HistoricoAgendamento']['paciente_id']	= $request['Agenda']['paciente_id'];
			$historico['HistoricoAgendamento']['data_agenda']	= $request['Agenda']['data_agenda'];
			$historico['HistoricoAgendamento']['horario']		= $request['Agenda']['horario'];
			$historico['HistoricoAgendamento']['situacao']		= $request['Agenda']['situacao'];
			
			$this->loadModel('HistoricoAgendamento');
			$this->HistoricoAgendamento->save($historico);
		}
		
	}
	
	public function senha_horario_extra() {
		
		$this->set('title_for_layout', 'Agenda :: Senha Horário Extra');
		
		if ($this->request->data) {
			
			$senha_atual = $this->request->data['Agenda']['senha_atual'];
			$senha_nova = $this->request->data['Agenda']['senha_nova'];
			$senha_confirma = $this->request->data['Agenda']['senha_confirma'];
			
			if (!$senha_atual) {
				return $this->Session->setFlash('Senha atual deve ser informada!', 'default', array('class' => 'flashError'));
			}
			
			if (!$senha_nova) {
				return $this->Session->setFlash('Nova Senha deve ser informada!', 'default', array('class' => 'flashError'));
			}

			if (!$senha_confirma) {
				return $this->Session->setFlash('Confirmação da Senha deve ser informada!', 'default', array('class' => 'flashError'));
			}
			
			$this->loadModel('Parametro');
			
			$senha_horario_extra = $this->Parametro->get_senha_agendar_horario_extra();
			
			if ($senha_horario_extra && $senha_horario_extra != AuthComponent::password($senha_atual)) {
				return $this->Session->setFlash('Senha Atual não confere!', 'default', array('class' => 'flashError'));
			}
			
			if ($senha_nova != $senha_confirma) {
				return $this->Session->setFlash('Confirmação da Senha não confere!', 'default', array('class' => 'flashError'));
			}
			
			if ($this->Parametro->set_senha_agendar_horario_extra($senha_nova)) {
				$this->Session->setFlash('Senha alterada com sucesso!', 'default', array('class' => 'flashOk'));
			} else {
				$this->Session->setFlash('Houve um erro ao tentar alterar a senha!', 'default', array('class' => 'flashError'));
			}
			
		}
		
	}
	
	public function senha_excluir_horario() {
		
		$this->set('title_for_layout', 'Agenda :: Senha Exclusão de Horário');
		
		if ($this->request->data) {
			
			$senha_atual = $this->request->data['Agenda']['senha_atual'];
			$senha_nova = $this->request->data['Agenda']['senha_nova'];
			$senha_confirma = $this->request->data['Agenda']['senha_confirma'];
			
			if (!$senha_atual) {
				return $this->Session->setFlash('Senha atual deve ser informada!', 'default', array('class' => 'flashError'));
			}
			
			if (!$senha_nova) {
				return $this->Session->setFlash('Nova Senha deve ser informada!', 'default', array('class' => 'flashError'));
			}

			if (!$senha_confirma) {
				return $this->Session->setFlash('Confirmação da Senha deve ser informada!', 'default', array('class' => 'flashError'));
			}
			
			$this->loadModel('Parametro');
			
			$senha_excluir_horario = $this->Parametro->get_senha_excluir_horario();
			
			if ($senha_excluir_horario && $senha_excluir_horario != AuthComponent::password($senha_atual)) {
				return $this->Session->setFlash('Senha Atual não confere!', 'default', array('class' => 'flashError'));
			}
			
			if ($senha_nova != $senha_confirma) {
				return $this->Session->setFlash('Confirmação da Senha não confere!', 'default', array('class' => 'flashError'));
			}
			
			if ($this->Parametro->set_senha_excluir_horario($senha_nova)) {
				$this->Session->setFlash('Senha alterada com sucesso!', 'default', array('class' => 'flashOk'));
			} else {
				$this->Session->setFlash('Houve um erro ao tentar alterar a senha!', 'default', array('class' => 'flashError'));
			}
			
		}
		
	}	
	
	public function validar_agendamento($request) {
		
		$resultado['sucesso'] = true;
		$resultado['mensagem'] = false; // Se preenchido, um alert será exibido, independente de sucesso
		$resultado['tipo'] = 'warning'; // ou error
		
		if (in_array($request['Agenda']['situacao'], array(1,5,6,9,10))) {
			return $resultado;
		}
		
		//------------------------------------------ ERROS:
		
		if (!$request['Agenda']['paciente_id']) {
			$resultado['sucesso'] = false;
			$resultado['mensagem'] = 'Paciente deve ser informado!<br />';
			$resultado['tipo'] = 'error';
			return $resultado;
		}
		
		if ($request['Agenda']['primeira_vez'] == '') {
			$resultado['sucesso'] = false;
			$resultado['mensagem'] = 'Informação de Primeira Vez deve ser informada!<br />';
			$resultado['tipo'] = 'error';
			return $resultado;
		}		
		
		if (!$request['Agenda']['procedimento_id']) {
			$resultado['sucesso'] = false;
			$resultado['mensagem'] = 'Procedimento deve ser informado!<br />';
			$resultado['tipo'] = 'error';
			return $resultado;
		}
		
		if (!$request['Agenda']['convenio_id']) {
			$resultado['sucesso'] = false;
			$resultado['mensagem'] = 'Convênio do Paciente deve ser informado!<br />';
			$resultado['tipo'] = 'error';
			return $resultado;
		}
		
		if ($this->{$this->modelClass}->find('first', array('conditions' => array('Agenda.id <>' => $request['Agenda']['id'], 'data_agenda' => $this->Agenda->date_to_us($request['Agenda']['data_agenda']), 'medico_id' => $request['Agenda']['medico_id'], 'paciente_id' => $request['Agenda']['paciente_id'])))) {
			$resultado['sucesso'] = false;
			$resultado['mensagem'] = 'Paciente já foi agendado para este médico, nesta data!<br />';
			$resultado['tipo'] = 'error';
			return $resultado;
		}		
		
		$convenio_nome = $this->{$this->modelClass}->Convenio->get_nome($request['Agenda']['convenio_id']);
		
		if (!$this->{$this->modelClass}->Medico->atende_convenio($request['Agenda']['medico_id'],$request['Agenda']['convenio_id'])) {
			$resultado['sucesso'] = false;
			$resultado['mensagem'] = "O médico não antende o convênio $convenio_nome.<br />";
			$resultado['tipo'] = 'error';
			return $resultado;
		}
		
		if ($request['Agenda']['primeira_vez'] == 'S') {
			//if (!$this->{$this->modelClass}->Medico->atende_primeira_vez($request['Agenda']['medico_id'],$request['Agenda']['convenio_id'],$request['Agenda']['paciente_id'])) {
			if ($this->{$this->modelClass}->Medico->MedicoConvenio->get_atende_primeira_vez($request['Agenda']['medico_id'], $request['Agenda']['convenio_id']) == 'N') {
				$resultado['sucesso'] = false;
				$resultado['mensagem'] = "O médico não antende PRIMEIRA VEZ no convênio $convenio_nome.<br />";
				$resultado['tipo'] = 'error';
				return $resultado;
			}
		}
		
		$procedimento_nome = $this->{$this->modelClass}->Procedimento->get_nome($request['Agenda']['procedimento_id']);

		$obj = $this->{$this->modelClass}->Medico->realiza_procedimento($request['Agenda']['medico_id'], $request['Agenda']['convenio_id'], $request['Agenda']['procedimento_id']);
		if (!$obj) {
			$resultado['sucesso'] = false;
			$resultado['mensagem'] = "O médico não realiza $procedimento_nome com o convênio $convenio_nome.<br />";
			$resultado['tipo'] = 'error';
			return $resultado;
		}		

		$total = $this->{$this->modelClass}->field('count(procedimento_id) as total', 
			array(
				'id <>' 			=> $request['Agenda']['id'],
				'medico_id' 		=> $request['Agenda']['medico_id'], 
				'procedimento_id' 	=> $request['Agenda']['procedimento_id'], 
				'data_agenda' 		=> $this->{$this->modelClass}->date_to_us($request['Agenda']['data_agenda']),
				'convenio_id'		=> $request['Agenda']['convenio_id']
			)
		);
		
		if ($obj['MedicoconvenioProcedimento']['atendimentos_por_dia'] > 0 && $total >= $obj['MedicoconvenioProcedimento']['atendimentos_por_dia'] && $request['Agenda']['tipo_horario'] == 'N') {
			$resultado['sucesso'] = false;
			$resultado['mensagem'] = "O médico realiza apenas {$obj['MedicoconvenioProcedimento']['atendimentos_por_dia']} procedimento(s) $procedimento_nome para o convênio $convenio_nome. Na agenda atual, existe(m) $total marcado(s) com o convênio selecionado.<br />";
			$resultado['tipo'] = 'error';
			return $resultado;
		}		
		
		//------------------------------------------ WARNINGS:
		/*
		if (!$this->{$this->modelClass}->Medico->atende_paciente($request['Agenda']['medico_id'], $request['Agenda']['paciente_id'])) {
			$resultado['sucesso'] = true;
			$resultado['mensagem'] = 'O paciente está na lista negra do médico. Recomendações: ' . $this->{$this->modelClass}->Medico->ListanegraMedicopaciente->get_recomendacoes($request['Agenda']['medico_id'], $request['Agenda']['paciente_id']) . '<br />';
			$resultado['tipo'] = 'warning';
		}
		*/		

		return $resultado;
	}
	
	public function verificar_agenda() {
		
		$this->loadModel('Parametro');
		
		$dt_verifcacao = $this->Parametro->get_valor('data_ultima_verificacao_agenda');
		$dt_atual = $this->{$this->modelClass}->today();
		
		if (!$dt_verifcacao || $dt_verifcacao < $dt_atual) {
			
			$agenda = $this->{$this->modelClass}->find('first', 
				array(
					'conditions' => array('data_agenda <' => $dt_atual),
					'order' => 'data_agenda desc', 
					'callbacks' => false
				)
			);
			
			$this->verificacao_agenda($agenda['Agenda']['data_agenda']);

			$this->Parametro->set_valor('data_ultima_verificacao_agenda', $dt_atual);
		}
	}
	
	public function verificacao_agenda($data_agenda) {

		$data_agenda = $this->{$this->modelClass}->date_to_us($data_agenda);
		
		$marcacoes = $this->{$this->modelClass}->find('all', 
			array(
				'conditions' => array(
					'data_agenda' => $data_agenda,
					'situacao' => array(2, 3)
				), 
				'recursive' => 0,
				'fields' => array('Agenda.id', 'Agenda.situacao', 'Paciente.id')
			)
		);
		
		$tot_alteracoes = 0;
		
		// a pesquisa acima traz apenas situações 2 e 3
		foreach ($marcacoes as $marcacao) {
			
			$sit = ($marcacao['Agenda']['situacao'] == 2) ? 6 : 4;
			
			$obj['Agenda']['id'] = $marcacao['Agenda']['id'];
			$obj['Agenda']['situacao'] = $sit;
			
			if ($this->{$this->modelClass}->save($obj, array('callbacks' => false, 'validate' => false))) {
				$tot_alteracoes++;
			}
			
			/*
			if ($sit == 4) {
				// alterar o campo 1a vez do paciente para "não"
				$pac['Paciente']['id'] = $marcacao['Paciente']['id'];
				$pac['Paciente']['primeira_vez'] = 'N';
				$this->{$this->modelClass}->Paciente->save($pac, array('callbacks' => false, 'validate' => false));
			}
			*/
		}
		
		return $tot_alteracoes;
	}
	
}